package thread;

public class demo20 {
    public static void main(String[] args) throws InterruptedException {
        Object locker=new Object();
        Thread t1=new Thread(()->{
           synchronized (locker){
               //加锁状态
               System.out.println("t1先拿到锁");
               System.out.println("我想要t2先拿锁先去执行一定的任务之后");
               System.out.println("t1线程再来执行,也就是说t1此时还不是时候执行");
               try {
                   //阻塞等待状态
                   System.out.println("调用wait放锁,让t2拿到锁先去执行任务");
                   locker.wait();
                   //--------
               } catch (InterruptedException e) {
                   throw new RuntimeException(e);
               }
               //唤醒后
               //加锁状态---代码继续执行
               System.out.println("t2执行任务后唤醒t1,t1该执行任务咯");
               // 要执行的任务-----
           }
        });
        Thread t2=new Thread(()->{
            synchronized (locker){
             //t1加锁中
                System.out.println("t2加锁当中");
                //
                System.out.println("t2任务执行完毕,是时候该t1线程去执行了");
                System.out.println("是时候该唤醒t1线程了");
                locker.notify();
            }
        });
        //虽然这里两个start看起来有顺序,但是线程开启后调度是随机的,不一定先开启先执行
        //多执行几次就可以发现出现t1 t2 线程谁先执行是随机的
        t1.start();
        t2.start();



    }


}
